/**
 * 日本旅行实用英语指南 - Service Worker
 * 
 * 用于缓存资源，支持离线访问
 */

// 缓存名称及版本
const CACHE_NAME = 'japan-travel-english-guide-v1';

// 需要缓存的资源列表
const ASSETS = [
  '/',
  '/index.html',
  '/css/styles.css',
  '/js/main.js',
  '/js/audio-manager.js',
  '/charts/japan_travel_scenes_pie.html',
  '/charts/japan_travel_scenes_treemap.html',
  '/charts/japan_travel_popular_phrases_chart.html',
  '/charts/japan_travel_english_phrases_chart.html',
  '/charts/japan_travel_english_guide.html',
  // 图标和字体资源
  'https://cdn.bootcdn.net/ajax/libs/font-awesome/6.4.0/css/all.min.css',
  'https://g.alicdn.com/code/lib/tailwindcss/2.2.19/tailwind.min.css',
  'https://g.alicdn.com/code/lib/echarts/5.6.0/echarts.min.js',
  // 下面是音频文件，实际部署时需添加所有音频文件
  '/audio/what-is-the-purpose-of-your-visit.mp3',
  '/audio/i-am-here-for-tourism.mp3',
  '/audio/how-long-will-you-stay.mp3'
];

// 安装Service Worker并缓存必要文件
self.addEventListener('install', event => {
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then(cache => {
        console.log('缓存已开启');
        return cache.addAll(ASSETS);
      })
      .then(() => self.skipWaiting())
  );
});

// 激活新的Service Worker
self.addEventListener('activate', event => {
  event.waitUntil(
    caches.keys()
      .then(cacheNames => {
        return Promise.all(
          cacheNames.filter(name => name !== CACHE_NAME)
            .map(name => {
              console.log('删除旧缓存：', name);
              return caches.delete(name);
            })
        );
      })
      .then(() => self.clients.claim())
  );
});

// 拦截请求
self.addEventListener('fetch', event => {
  // 忽略非GET请求和第三方请求
  if (event.request.method !== 'GET' || !event.request.url.startsWith(self.location.origin)) {
    return;
  }
  
  event.respondWith(
    caches.match(event.request)
      .then(response => {
        // 如果找到缓存的响应，返回它
        if (response) {
          return response;
        }
        
        // 克隆请求，因为请求只能使用一次
        const fetchRequest = event.request.clone();
        
        // 否则发送网络请求
        return fetch(fetchRequest)
          .then(response => {
            // 检查是否有效
            if (!response || response.status !== 200 || response.type !== 'basic') {
              return response;
            }
            
            // 克隆响应
            const responseToCache = response.clone();
            
            // 缓存新的响应
            caches.open(CACHE_NAME)
              .then(cache => {
                cache.put(event.request, responseToCache);
              });
              
            return response;
          })
          .catch(err => {
            // 如果是音频文件且发生错误，可以返回一个默认的提示音频
            if (event.request.url.includes('/audio/')) {
              console.log('音频文件加载失败，可能离线或文件不存在');
              // 这里可以返回一个默认的提示音频
            }
            
            console.error('请求失败:', err);
            // 如果没有缓存且网络请求失败，返回一个离线页面
            return caches.match('/offline.html');
          });
      })
  );
});

// 后台同步
self.addEventListener('sync', event => {
  if (event.tag === 'sync-phrases') {
    event.waitUntil(syncPhrases());
  }
});

// 后台同步函数
function syncPhrases() {
  // 实现同步逻辑，例如同步用户收藏的短语
  return Promise.resolve();
}

// 推送通知
self.addEventListener('push', event => {
  const data = event.data.json();
  const options = {
    body: data.body,
    icon: '/images/icon-192x192.png',
    badge: '/images/badge.png'
  };
  
  event.waitUntil(
    self.registration.showNotification('日本旅行实用英语指南', options)
  );
});

// 通知点击
self.addEventListener('notificationclick', event => {
  event.notification.close();
  
  event.waitUntil(
    clients.openWindow('/')
  );
});